package busterminal.persistence.memory;

import busterminal.entity.Route;
import busterminal.entity.StoppingPoint;
import busterminal.persistence.RouteDAO;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * Реализация интерфейса Data Access Object для марщрута
 */
class MemoryRouteDAO extends AbstractMemoryDAO<Route> implements RouteDAO {

    /**
     * Коллекция, содержащая информацию о всех маршрутах
     */
    private static Map<Integer, Route> dataSource = new HashMap<Integer, Route>();
    /**
     * Идентификатор маршрута
     */
    private static int counter = 1;

    /**
     * Конструктор по умолчанию
     */
    public MemoryRouteDAO() {
    }

    /**
     * Получить коллекцию, содержащую информацию о всех маршрутах
     * @return коллекция
     */
    @Override
    protected Map getDataSource() {
        return dataSource;
    }

    /**
     * Получить идентификатор маршрута и увеличить его
     * @return идентификатор
     */
    @Override
    protected Integer getAndIncreaseCounter() {
        return counter++;
    }

    /**
     * Найти список маршрутов в хранилище по названию маршрута
     * @param routeName название маршрута
     * @return список маршрутов
     */
    @Override
    public List<Route> findByRouteName(String routeName) {
        List<Route> list = new ArrayList<Route>();
        for (Route route : dataSource.values()) {
            if (route.getRouteName().equals(routeName)) {
                list.add(route);
            }
        }
        return list;
    }
    
    /**
     * Найти список маршрутов в хранилище по названию конечного или промежуточного остановочного пункта
     * @param stoppingPointName название конечного или промежуточного остановочного пункта
     * @return список маршрутов
     */
    @Override
    public List<Route> findByStoppingPointName(String stoppingPointName) {
        List<Route> list = new ArrayList<Route>();
        for (Route route : dataSource.values()) {
            if (route.getEndPoint().getStoppingPointName().equals(stoppingPointName)) {
                list.add(route);
            }
            for (StoppingPoint stoppingPoint : route.getIntermediateStoppingPointsList()) {
                if (stoppingPoint.getStoppingPointName().equals(stoppingPointName)) {
                    list.add(route);
                }
            }
        }
        return list;       
    }
    
}
